import lodash from 'lodash';
import {
    convertSecToMinAndSec,
    createAGroupFolder,
    getCurrentDate,
    getPlayerData,
    isGroupExist,
    isPlayerExist,
    readConfiguration,
    storagePlayerData,
    timestampToSeconds
} from '../function/function.js';

export class Bs extends plugin {
    constructor() {
        super({
            name: '[Bs]买面包',
            dsc: '买面包',
            event: 'message',
            priority: 1,
            rule: [
                { reg: /^[#\/]买.*/, fnc: 'buy' }
            ]
        })
    }

    async buy(e) {
        // 非群无法游玩
        if (!e.isGroup) return e.reply(['该游戏只能在群内使用'])
        /** ID [群, 用户] */
        const ID = [e.group_id, e.user_id]
        /** 用户输入内容 */
        const USER_INPUT_CONTENT = e.msg.replace(/#|\/|买/g, '')
        /** 配置数据 */
        const configData = await readConfiguration()
        /** 默认物品 */
        let defaultItem = configData['bread_thing']
        /** 自定义物品 */
        const CUSTOM_ITEMS = configData['special_thing_group'][ID[0]]

        // 判断执行条件 [不存在自定义物品 同时 用户输入内容不为默认物品] 或者 [存在自定义物品 同时 用户输入内容不为自定义物品]
        if (!CUSTOM_ITEMS && USER_INPUT_CONTENT !== defaultItem || CUSTOM_ITEMS && USER_INPUT_CONTENT !== CUSTOM_ITEMS) return false
        // 存在自定义物品 默认物品修改为自定义物品
        if (CUSTOM_ITEMS) {
            defaultItem = CUSTOM_ITEMS
        }

        // 判断是否有此群文件夹，没有则创建
        if (!isGroupExist(ID[0])) { createAGroupFolder(ID[0]) }

        // 判断是否存在该用户，没有则创建基础信息
        if (!isPlayerExist(ID[0], ID[1])) {
            storagePlayerData(ID[0], ID[1], {
                name: e.sender.card || '未设置面包昵称',
                lv: 0,
                xp: 0,
                number: 0,
                cd: { buy: 0, eat: 0, rob: 0, give: 0, bet: 0 },
                log: { buy: [], eat: [], rob: [], give: [], bet: [] }
            })
        }

        /** 用户数据 */
        const USER_DATA = await getPlayerData(ID[0], ID[1])
        /** 用户面包数量 */
        const USER_NUMBER = USER_DATA['number']
        /** 当前秒 */
        const CURRENT_SECOND = timestampToSeconds(Date.now())
        /** 剩余CD */
        const REMAINING_TIME = CURRENT_SECOND - USER_DATA['cd']['buy']

        // 若剩余CD为负数，则CD还未结束，返回提示
        if (REMAINING_TIME < 0) {
            const { minutes, remainingSeconds } = convertSecToMinAndSec(Math.abs(REMAINING_TIME))
            if (minutes > 0) {
                return e.reply([`无法买${defaultItem}，还有${minutes}分${remainingSeconds}秒`])
            } else {
                return e.reply([`无法买${defaultItem}，还有${remainingSeconds}秒`])
            }
        }

        /** 买到的面包数量 */
        let buyNumber = lodash.random(configData['min_buy'], configData['max_buy'])
        /** 返回消息 */
        let msg = `成功购买了${buyNumber}个${defaultItem}\r现在一共拥有${USER_NUMBER + buyNumber}个${defaultItem}啦~`

        /** 1~0 之间的随机数 */
        const RANDOM_NUMBER = Math.random();
        /** 随机事件 */
        if (RANDOM_NUMBER < 0.025) {
            if (USER_NUMBER > configData['max_buy']) { // 触发条件 面包数量大于购买操作上限
                msg = `你刚要去买${defaultItem}，发现自己${buyNumber}个${defaultItem}坏掉了！好难过，不想买啦！`
                buyNumber = -buyNumber
            }
        } else if (RANDOM_NUMBER < 0.01) {
            buyNumber += 20
            msg = `出现了！黄金${defaultItem}！计为${buyNumber}个！现在一共拥有${USER_NUMBER + buyNumber}个${defaultItem}~`
        } else if (RANDOM_NUMBER < 0.2) {
            if (USER_NUMBER < 10) { // 触发条件 面包数量小于10
                buyNumber += 10
                msg = `${defaultItem}店看你${defaultItem}太少了，送了你${buyNumber}个！现在一共拥有${USER_NUMBER + buyNumber}个${defaultItem}~`
            }
        } else if (RANDOM_NUMBER < 0.8) {
            if (USER_NUMBER > 90) { // 触发条件 面包数量大于90
                buyNumber = 0
                msg = `你${defaultItem}太多啦！不卖给你了，快吃！现在一共拥有${USER_DATA['number']}个${defaultItem}~`
            }
        }

        // 用户数据处理 & 存储
        USER_DATA['cd']['buy'] = CURRENT_SECOND + configData['cd_buy']
        USER_DATA['log']['buy'].push(`[${getCurrentDate()}] 买了${buyNumber}个${defaultItem}`)
        USER_DATA['number'] += buyNumber
        storagePlayerData(ID[0], ID[1], USER_DATA)

        // 返回买面包结果
        return e.reply([msg])
    }
}